package day3;
public class leetcode25 {
    /**、
     * 给你链表的头节点 head ，每 k 个节点一组进行翻转，请你返回修改后的链表。
     *
     * k 是一个正整数，它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍，那么请将最后剩余的节点保持原有顺序。
     *
     * 你不能只是单纯的改变节点内部的值，而是需要实际进行节点交换。
     *
     *
     *
     * 示例 1：
     *
     *
     * 输入：head = [1,2,3,4,5], k = 2
     * 输出：[2,1,4,3,5]
     * 示例 2：
     *
     *
     *
     * 输入：head = [1,2,3,4,5], k = 3
     * 输出：[3,2,1,4,5]
     *
     */
    public class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }

        public ListNode reverseKGroup(ListNode head, int k) {
            ListNode d=new ListNode(0);
            d.next=head;
            ListNode pre =d;
            ListNode end=d;
            while(end!=null){
                for(int i=0;i<k&&end!=null;i++)end=end.next;
                if(end==null)break;
                ListNode next=end.next;

                end.next=null;
                ListNode s=pre.next;

                reverse(pre.next);
                pre.next=end;
                s.next=next;
                pre=s;
                end=s;
            }
            return d.next;
        }
        public ListNode reverse(ListNode head){
            ListNode pre = null;
            ListNode curr = head;
            while (curr != null) {
                ListNode next = curr.next;
                curr.next = pre;
                pre = curr;
                curr = next;
            }
            return pre;
        }

}
